package com.project.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.project.bean.LogBean;
import com.project.bean.UserBean;
import com.project.service.ILogService;
import com.project.service.IUserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private IUserService userService;
    @Autowired
    private ILogService logService;
    @RequestMapping("login")
    public UserBean login(String userName, String pwd, HttpServletRequest req){
//        UserBean user=userService.login(userName, pwd);
//        if (user !=null){
//            //在session中保存登录用户
//            req.getSession().setAttribute("loginUser",user);
//        }
//        return user;
        //得到主体
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(userName, pwd));
            UserBean user= (UserBean) subject.getPrincipal();
            SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm");
            logService.addLog(new LogBean("用户"+user.getRealName()+"在"+dateFormat.format(new Date())+"登录系统"));
            req.getSession().setAttribute("loginUser",user);
            return user;
        }catch (Exception e){
            return null;
        }

    }


    @RequestMapping("updatePwd")
    public String updatePwd(String oldPwd,String newPwd,HttpServletRequest req){
        System.out.println(oldPwd);
        UserBean loginUser= (UserBean) req.getSession().getAttribute("loginUser");
        Md5Hash md5Hash=new Md5Hash(oldPwd,loginUser.getSalt(),1024);
        if (loginUser.getPwd().equals(md5Hash.toHex())){
            userService.updatePwd(loginUser.getUserId(),newPwd);
            return "ok";
        }else {
            return "旧密码错误";
        }

    }

    @RequestMapping("getUser")
    public UserBean getUser(HttpServletRequest request){
        return (UserBean) request.getSession().getAttribute("loginUser");
    }

    /**
     * 根据用户名动态分页查询用户表
     * @param pageNO 页码
     * @param userName 用户名
     * @return 分页对象
     */
    @RequestMapping("cutByItem")
    @RequiresPermissions("user:am")
    public IPage<UserBean> cutByItem(Integer pageNO, String userName){

        return userService.cutByItem(pageNO, userName);
    }

    /**
     * 通过用户名查询用户
     * @param userName 用户名
     * @return 用户对象
     */
    @RequestMapping("findByUserName")
    @RequiresPermissions("user:am")
    public UserBean findByUserName(String userName){
        return userService.findByUserName(userName);
    }

    /**
     * 添加用户信息，同时添加该用户拥有的角色信息（中间表）
     * @param user 用户对象
     * @param roleId 角色ID数组
     */
    @RequestMapping("add")
    @RequiresPermissions("user:am")
    public String add(UserBean user, Integer[] roleId){
        userService.add(user,roleId);
        return "ok";
    }

    /**
     * 删除用户，同时删除用户拥有的角色信息
     * 先删除中间表该用户的角色，再删除用户
     * @param userId 删除用户ID
     */
    @RequestMapping("del")
    @RequiresPermissions("user:am")
    public String del(Integer userId){
        userService.del(userId);
        return "ok";
    }

    /**
     * 通过id查询用户信息，同时查询该用户拥有的角色集合，和权限集合
     * @param userId 用户ID
     * @return 用户对象
     */
    @RequestMapping("findById")
    @RequiresPermissions("user:am")
    public UserBean findById(Integer userId){
        return userService.findById(userId);
    }

    /**
     * 通过用户id修改用户的角色
     * 先通过用户id删除中间表相关信息，再添加新的角色信息
     * @param userId 用户ID
     * @param newRoleId 新角色数组
     */
    @RequestMapping("updateRole")
    @RequiresPermissions("user:amm")
    public String updateRole(Integer userId,Integer[] newRoleId){
        userService.updateRole(userId,newRoleId);
        return "ok";
    }
}
